From 2aeb7042d008703a6c884eaa3133c82acde9b17a Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 8 Jul 2011 23:42:01 -0400 Subject: [PATCH] Drop the fake GailUtil subclass Since it is not a subclass at all. Instead, just have a function that overrides the vfuncs in AtkUtilClass. --- gtk/a11y/gail.c | 3 +- gtk/a11y/gailutil.c | 480 ++++++++++++++++++++------------------------ gtk/a11y/gailutil.h | 23 +-- 3 files changed, 225 insertions(+), 281 deletions(-) diff --git a/gtk/a11y/gail.c b/gtk/a11y/gail.c index 2146719e52..401dccc50e 100644 --- a/gtk/a11y/gail.c +++ b/gtk/a11y/gail.c @@ -798,8 +798,7 @@ gail_accessibility_module_init (void) atk_focus_tracker_init (gail_focus_tracker_init); focus_tracker_id = atk_add_focus_tracker (gail_focus_tracker); - /* Initialize the GailUtility class */ - g_type_class_unref (g_type_class_ref (GAIL_TYPE_UTIL)); + gail_util_install (); atk_misc_instance = g_object_new (GAIL_TYPE_MISC, NULL); } diff --git a/gtk/a11y/gailutil.c b/gtk/a11y/gailutil.c index e19ba8211f..c59bc3f5b3 100644 --- a/gtk/a11y/gailutil.c +++ b/gtk/a11y/gailutil.c @@ -27,30 +27,6 @@ #include "gtkwindowaccessible.h" -static guint add_listener (GSignalEmissionHook listener, - const gchar *object_type, - const gchar *signal, - const gchar *hook_data); -static void do_window_event_initialization (void); -static gboolean state_event_watcher (GSignalInvocationHint *hint, - guint n_param_values, - const GValue *param_values, - gpointer data); -static void window_added (AtkObject *atk_obj, - guint index, - AtkObject *child); -static void window_removed (AtkObject *atk_obj, - guint index, - AtkObject *child); -static gboolean window_focus (GtkWidget *widget, - GdkEventFocus *event); -static gboolean configure_event_watcher (GSignalInvocationHint *hint, - guint n_param_values, - const GValue *param_values, - gpointer data); - - -static AtkObject* root = NULL; static GHashTable *listener_list = NULL; static gint listener_idx = 1; static GSList *key_listener_list = NULL; @@ -72,8 +48,225 @@ struct _GailKeyEventInfo gpointer func_data; }; -G_DEFINE_TYPE (GailUtil, gail_util, ATK_TYPE_UTIL) +static guint +add_listener (GSignalEmissionHook listener, + const gchar *object_type, + const gchar *signal, + const gchar *hook_data) +{ + GType type; + guint signal_id; + gint rc = 0; + + type = g_type_from_name (object_type); + if (type) + { + signal_id = g_signal_lookup (signal, type); + if (signal_id > 0) + { + GailUtilListenerInfo *listener_info; + + rc = listener_idx; + + listener_info = g_new (GailUtilListenerInfo, 1); + listener_info->key = listener_idx; + listener_info->hook_id = + g_signal_add_emission_hook (signal_id, 0, listener, + g_strdup (hook_data), + (GDestroyNotify) g_free); + listener_info->signal_id = signal_id; + + g_hash_table_insert (listener_list, &(listener_info->key), listener_info); + listener_idx++; + } + else + { + g_warning("Invalid signal type %s\n", signal); + } + } + else + { + g_warning("Invalid object type %s\n", object_type); + } + return rc; +} + +static gboolean +state_event_watcher (GSignalInvocationHint *hint, + guint n_param_values, + const GValue *param_values, + gpointer data) +{ + GObject *object; + GtkWidget *widget; + AtkObject *atk_obj; + AtkObject *parent; + GdkEventWindowState *event; + gchar *signal_name; + + object = g_value_get_object (param_values + 0); + if (!GTK_IS_WINDOW (object)) + return FALSE; + + event = g_value_get_boxed (param_values + 1); + if (event->type == GDK_WINDOW_STATE) + return FALSE; + widget = GTK_WIDGET (object); + + if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) + signal_name = "maximize"; + else if (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) + signal_name = "minimize"; + else if (event->new_window_state == 0) + signal_name = "restore"; + else + return TRUE; + + atk_obj = gtk_widget_get_accessible (widget); + if (GTK_IS_WINDOW_ACCESSIBLE (atk_obj)) + { + parent = atk_object_get_parent (atk_obj); + if (parent == atk_get_root ()) + g_signal_emit_by_name (atk_obj, signal_name); + + return TRUE; + } + + return FALSE; +} + +static gboolean +configure_event_watcher (GSignalInvocationHint *hint, + guint n_param_values, + const GValue *param_values, + gpointer data) +{ + GtkAllocation allocation; + GObject *object; + GtkWidget *widget; + AtkObject *atk_obj; + AtkObject *parent; + GdkEvent *event; + gchar *signal_name; + object = g_value_get_object (param_values + 0); + if (!GTK_IS_WINDOW (object)) + return FALSE; + + event = g_value_get_boxed (param_values + 1); + if (event->type != GDK_CONFIGURE) + return FALSE; + widget = GTK_WIDGET (object); + gtk_widget_get_allocation (widget, &allocation); + if (allocation.x == ((GdkEventConfigure *)event)->x && + allocation.y == ((GdkEventConfigure *)event)->y && + allocation.width == ((GdkEventConfigure *)event)->width && + allocation.height == ((GdkEventConfigure *)event)->height) + return TRUE; + + if (allocation.width != ((GdkEventConfigure *)event)->width || + allocation.height != ((GdkEventConfigure *)event)->height) + signal_name = "resize"; + else + signal_name = "move"; + + atk_obj = gtk_widget_get_accessible (widget); + if (GTK_IS_WINDOW_ACCESSIBLE (atk_obj)) + { + parent = atk_object_get_parent (atk_obj); + if (parent == atk_get_root ()) + g_signal_emit_by_name (atk_obj, signal_name); + + return TRUE; + } + + return FALSE; +} + +static gboolean +window_focus (GtkWidget *widget, + GdkEventFocus *event) +{ + AtkObject *atk_obj; + + g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); + + atk_obj = gtk_widget_get_accessible (widget); + g_signal_emit_by_name (atk_obj, event->in ? "activate" : "deactivate"); + + return FALSE; +} + +static void +window_added (AtkObject *atk_obj, + guint index, + AtkObject *child) +{ + GtkWidget *widget; + + if (!GTK_IS_WINDOW_ACCESSIBLE (child)) + return; + + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (child)); + if (!widget) + return; + + g_signal_connect (widget, "focus-in-event", (GCallback) window_focus, NULL); + g_signal_connect (widget, "focus-out-event", (GCallback) window_focus, NULL); + g_signal_emit_by_name (child, "create"); +} + + +static void +window_removed (AtkObject *atk_obj, + guint index, + AtkObject *child) +{ + GtkWidget *widget; + GtkWindow *window; + + if (!GTK_IS_WINDOW_ACCESSIBLE (child)) + return; + + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (child)); + if (!widget) + return; + + window = GTK_WINDOW (widget); + /* + * Deactivate window if it is still focused and we are removing it. This + * can happen when a dialog displayed by gok is removed. + */ + if (gtk_window_is_active (window) && + gtk_window_has_toplevel_focus (window)) + { + AtkObject *atk_obj; + + atk_obj = gtk_widget_get_accessible (widget); + g_signal_emit_by_name (atk_obj, "deactivate"); + } + + g_signal_handlers_disconnect_by_func (widget, (gpointer) window_focus, NULL); + g_signal_emit_by_name (child, "destroy"); +} + +static void +do_window_event_initialization (void) +{ + AtkObject *root; + + g_type_class_ref (GTK_TYPE_WINDOW_ACCESSIBLE); + g_signal_add_emission_hook (g_signal_lookup ("window-state-event", GTK_TYPE_WIDGET), + 0, state_event_watcher, NULL, (GDestroyNotify) NULL); + g_signal_add_emission_hook (g_signal_lookup ("configure-event", GTK_TYPE_WIDGET), + 0, configure_event_watcher, NULL, (GDestroyNotify) NULL); + + root = atk_get_root (); + g_signal_connect (root, "children-changed::add", + (GCallback) window_added, NULL); + g_signal_connect (root, "children-changed::remove", + (GCallback) window_removed, NULL); +} static guint gail_util_add_global_event_listener (GSignalEmissionHook listener, const gchar *event_type) @@ -270,6 +463,8 @@ gail_util_remove_key_event_listener (guint listener_key) static AtkObject * gail_util_get_root (void) { + static AtkObject *root = NULL; + if (!root) { root = g_object_new (GTK_TYPE_TOPLEVEL_ACCESSIBLE, NULL); @@ -291,234 +486,10 @@ gail_util_get_toolkit_version (void) return GTK_VERSION; } -static guint -add_listener (GSignalEmissionHook listener, - const gchar *object_type, - const gchar *signal, - const gchar *hook_data) -{ - GType type; - guint signal_id; - gint rc = 0; - - type = g_type_from_name (object_type); - if (type) - { - signal_id = g_signal_lookup (signal, type); - if (signal_id > 0) - { - GailUtilListenerInfo *listener_info; - - rc = listener_idx; - - listener_info = g_new (GailUtilListenerInfo, 1); - listener_info->key = listener_idx; - listener_info->hook_id = - g_signal_add_emission_hook (signal_id, 0, listener, - g_strdup (hook_data), - (GDestroyNotify) g_free); - listener_info->signal_id = signal_id; - - g_hash_table_insert (listener_list, &(listener_info->key), listener_info); - listener_idx++; - } - else - { - g_warning("Invalid signal type %s\n", signal); - } - } - else - { - g_warning("Invalid object type %s\n", object_type); - } - return rc; -} - -static void -do_window_event_initialization (void) -{ - AtkObject *root; - - g_type_class_ref (GTK_TYPE_WINDOW_ACCESSIBLE); - g_signal_add_emission_hook (g_signal_lookup ("window-state-event", GTK_TYPE_WIDGET), - 0, state_event_watcher, NULL, (GDestroyNotify) NULL); - g_signal_add_emission_hook (g_signal_lookup ("configure-event", GTK_TYPE_WIDGET), - 0, configure_event_watcher, NULL, (GDestroyNotify) NULL); - - root = atk_get_root (); - g_signal_connect (root, "children-changed::add", - (GCallback) window_added, NULL); - g_signal_connect (root, "children-changed::remove", - (GCallback) window_removed, NULL); -} - -static gboolean -state_event_watcher (GSignalInvocationHint *hint, - guint n_param_values, - const GValue *param_values, - gpointer data) -{ - GObject *object; - GtkWidget *widget; - AtkObject *atk_obj; - AtkObject *parent; - GdkEventWindowState *event; - gchar *signal_name; - - object = g_value_get_object (param_values + 0); - if (!GTK_IS_WINDOW (object)) - return FALSE; - - event = g_value_get_boxed (param_values + 1); - if (event->type == GDK_WINDOW_STATE) - return FALSE; - widget = GTK_WIDGET (object); - - if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) - signal_name = "maximize"; - else if (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) - signal_name = "minimize"; - else if (event->new_window_state == 0) - signal_name = "restore"; - else - return TRUE; - - atk_obj = gtk_widget_get_accessible (widget); - if (GTK_IS_WINDOW_ACCESSIBLE (atk_obj)) - { - parent = atk_object_get_parent (atk_obj); - if (parent == atk_get_root ()) - g_signal_emit_by_name (atk_obj, signal_name); - - return TRUE; - } - - return FALSE; -} - -static void -window_added (AtkObject *atk_obj, - guint index, - AtkObject *child) -{ - GtkWidget *widget; - - if (!GTK_IS_WINDOW_ACCESSIBLE (child)) - return; - - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (child)); - if (!widget) - return; - - g_signal_connect (widget, "focus-in-event", (GCallback) window_focus, NULL); - g_signal_connect (widget, "focus-out-event", (GCallback) window_focus, NULL); - g_signal_emit_by_name (child, "create"); -} - - -static void -window_removed (AtkObject *atk_obj, - guint index, - AtkObject *child) -{ - GtkWidget *widget; - GtkWindow *window; - - if (!GTK_IS_WINDOW_ACCESSIBLE (child)) - return; - - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (child)); - if (!widget) - return; - - window = GTK_WINDOW (widget); - /* - * Deactivate window if it is still focused and we are removing it. This - * can happen when a dialog displayed by gok is removed. - */ - if (gtk_window_is_active (window) && - gtk_window_has_toplevel_focus (window)) - { - AtkObject *atk_obj; - - atk_obj = gtk_widget_get_accessible (widget); - g_signal_emit_by_name (atk_obj, "deactivate"); - } - - g_signal_handlers_disconnect_by_func (widget, (gpointer) window_focus, NULL); - g_signal_emit_by_name (child, "destroy"); -} - -static gboolean -window_focus (GtkWidget *widget, - GdkEventFocus *event) +void +gail_util_install (void) { - AtkObject *atk_obj; - - g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); - - atk_obj = gtk_widget_get_accessible (widget); - g_signal_emit_by_name (atk_obj, event->in ? "activate" : "deactivate"); - - return FALSE; -} - -static gboolean -configure_event_watcher (GSignalInvocationHint *hint, - guint n_param_values, - const GValue *param_values, - gpointer data) -{ - GtkAllocation allocation; - GObject *object; - GtkWidget *widget; - AtkObject *atk_obj; - AtkObject *parent; - GdkEvent *event; - gchar *signal_name; - - object = g_value_get_object (param_values + 0); - if (!GTK_IS_WINDOW (object)) - return FALSE; - - event = g_value_get_boxed (param_values + 1); - if (event->type != GDK_CONFIGURE) - return FALSE; - widget = GTK_WIDGET (object); - gtk_widget_get_allocation (widget, &allocation); - if (allocation.x == ((GdkEventConfigure *)event)->x && - allocation.y == ((GdkEventConfigure *)event)->y && - allocation.width == ((GdkEventConfigure *)event)->width && - allocation.height == ((GdkEventConfigure *)event)->height) - return TRUE; - - if (allocation.width != ((GdkEventConfigure *)event)->width || - allocation.height != ((GdkEventConfigure *)event)->height) - signal_name = "resize"; - else - signal_name = "move"; - - atk_obj = gtk_widget_get_accessible (widget); - if (GTK_IS_WINDOW_ACCESSIBLE (atk_obj)) - { - parent = atk_object_get_parent (atk_obj); - if (parent == atk_get_root ()) - g_signal_emit_by_name (atk_obj, signal_name); - - return TRUE; - } - - return FALSE; -} - -static void -gail_util_class_init (GailUtilClass *klass) -{ - AtkUtilClass *atk_class; - gpointer data; - - data = g_type_class_peek (ATK_TYPE_UTIL); - atk_class = ATK_UTIL_CLASS (data); + AtkUtilClass *atk_class = ATK_UTIL_CLASS (g_type_class_ref (ATK_TYPE_UTIL)); atk_class->add_global_event_listener = gail_util_add_global_event_listener; atk_class->remove_global_event_listener = gail_util_remove_global_event_listener; @@ -530,8 +501,3 @@ gail_util_class_init (GailUtilClass *klass) listener_list = g_hash_table_new_full (g_int_hash, g_int_equal, NULL, g_free); } - -static void -gail_util_init (GailUtil *utils) -{ -} diff --git a/gtk/a11y/gailutil.h b/gtk/a11y/gailutil.h index 0e533c2da5..4aa8c8d7d5 100644 --- a/gtk/a11y/gailutil.h +++ b/gtk/a11y/gailutil.h @@ -24,28 +24,7 @@ G_BEGIN_DECLS -#define GAIL_TYPE_UTIL (gail_util_get_type ()) -#define GAIL_UTIL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GAIL_TYPE_UTIL, GailUtil)) -#define GAIL_UTIL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GAIL_TYPE_UTIL, GailUtilClass)) -#define GAIL_IS_UTIL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GAIL_TYPE_UTIL)) -#define GAIL_IS_UTIL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GAIL_TYPE_UTIL)) -#define GAIL_UTIL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GAIL_TYPE_UTIL, GailUtilClass)) - -typedef struct _GailUtil GailUtil; -typedef struct _GailUtilClass GailUtilClass; - -struct _GailUtil -{ - AtkUtil parent; - GList *listener_list; -}; - -struct _GailUtilClass -{ - AtkUtilClass parent_class; -}; - -GType gail_util_get_type (void); +void gail_util_install (void); G_END_DECLS -- 2.30.2